package com.spsoft.core.model.leqidmz.param;

import com.spsoft.core.annotation.EnumValue;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;

@ApiModel(value = "上传数电票参数")
@EqualsAndHashCode(callSuper = true)
@Data
public class UploadInvoiceParams extends BaseUserInfoParam {
    /**
     * 发票号码
     */
    @ApiModelProperty(value = "发票号码", required = true)
    @NotBlank(message = "发票号码不能为空")
    private String fphm;

    /**
     * 蓝字发票标志
     */
    @ApiModelProperty(value = "蓝字发票标志", required = true)
    @NotBlank(message = "蓝字发票标志不能为空")
    @EnumValue(strValues = {"0", "1"}, message = "蓝字发票标志只能是：0 蓝字发票 1 红字发票")
    private String lzfpbz;

    /**
     * 平台编号
     */
    @ApiModelProperty(value = "平台编号", required = true)
    @NotBlank(message = "平台编号不能为空")
    private String ptbh;

    /**
     * 发票票种
     */
    @ApiModelProperty(value = "发票票种", required = true)
    @NotBlank(message = "发票票种不能为空")
    @EnumValue(strValues = {"01", "02"}, message = "发票票种只能是：01 数电专 02 数电普")
    private String fppz;

    /**
     * 购买方自然人标志
     */
    @ApiModelProperty(value = "购买方自然人标志")
    @EnumValue(strValues = {"Y", "N"}, message = "购买方自然人标志只能是：Y 购买方是自然人 N 购买方非自然人")
    private String gmfzrrbz;

    /**
     * 特定要素
     */
    @ApiModelProperty(value = "特定要素")
    @EnumValue(strValues = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18"},
               message = "特定要素只能是：空 非特定要素 01 成品油发票 02 稀土发票 03 建筑服务发票 04 货物运输服务发票 05 不动产销售服务发票 " +
                         "06 不动产租赁服务发票 07 代收车船税 08 通行费 09 旅客运输服务发票 10 医疗服务（住院）发票 11 医疗服务（门诊）发票 " +
                         "12 自产农产品销售发票 13 拖拉机和联合收割机发票 14 机动车 15 二手车 16 农产品收购发票 17 光伏收购发票 18 卷烟发票")
    private String tdys;

    /**
     * 区域代码
     */
    @ApiModelProperty(value = "区域代码", required = true)
    @NotBlank(message = "区域代码不能为空")
    private String qyDm;

    /**
     * 差额征税类型代码
     */
    @ApiModelProperty(value = "差额征税类型代码")
    @EnumValue(strValues = {"01", "02"}, message = "差额征税类型代码只能是：空 非差额发票 01 全额开票 02 差额开票")
    private String cezslxDm;

    /**
     * 收购发票类型代码
     */
    @ApiModelProperty(value = "收购发票类型代码")
    @EnumValue(strValues = {"01", "02", "03"}, message = "收购发票类型代码只能是：空 非收购发票 01 农产品收购发票 02 光伏收购发票 03 二手车收购发票")
    private String sgfplxDm;

    /**
     * 出口业务适用政策代码
     */
    @ApiModelProperty(value = "出口业务适用政策代码")
    @EnumValue(strValues = {"01", "02", "03"}, message = "出口业务适用政策代码只能是：空 非出口业务 01 退税政策 02 免税政策 03 征税政策")
    private String ckywsyzcDm;

    /**
     * 增值税即征即退代码
     */
    @ApiModelProperty(value = "增值税即征即退代码")
    @EnumValue(strValues = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"},
               message = "增值税即征即退代码只能是：空 非增值税即征即退 01 软件产品发票 02 资源综合利用产品发票 03 管道运输服务发票 " +
                         "04 有形动产融资租赁服务 05 有形动产融资性售后回租服务发票 06 新型墙体材料发票 07 风力发电产品发票 " +
                         "08 光伏发电产品发票 09 动漫软件产品发票 10 飞机维修劳务发票 11 黄金发票 12 铂金发票")
    private String zzsjzjtDm;

    /**
     * （销售方）统一社会信用代码/纳税人识别号/身份证件号码
     */
    @ApiModelProperty(value = "（销售方）统一社会信用代码/纳税人识别号/身份证件号码", required = true)
    @NotBlank(message = "销售方纳税人识别号不能为空")
    private String xsfnsrsbh;

    /**
     * （销售方）名称
     */
    @ApiModelProperty(value = "（销售方）名称", required = true)
    @NotBlank(message = "销售方名称不能为空")
    private String xsfmc;

    /**
     * 销售方地址
     */
    @ApiModelProperty(value = "销售方地址")
    private String xsfdz;

    /**
     * 销售方电话
     */
    @ApiModelProperty(value = "销售方电话")
    private String xsfdh;

    /**
     * 销售方开户行
     */
    @ApiModelProperty(value = "销售方开户行")
    private String xsfkhh;

    /**
     * 销售方账号
     */
    @ApiModelProperty(value = "销售方账号")
    private String xsfzh;

    /**
     * （购买方）统一社会信用代码/纳税人识别号/身份证件号码
     *  开具数电专票时，必填
     */
    @ApiModelProperty(value = "（购买方）统一社会信用代码/纳税人识别号/身份证件号码")
    private String gmfnsrsbh;

    /**
     * （购买方）名称
     */
    @ApiModelProperty(value = "（购买方）名称", required = true)
    @NotBlank(message = "购买方名称不能为空")
    private String gmfmc;

    /**
     * 购买方地址
     */
    @ApiModelProperty(value = "购买方地址")
    private String gmfdz;

    /**
     * 购买方电话
     */
    @ApiModelProperty(value = "购买方电话")
    private String gmfdh;

    /**
     * 购买方开户行名称
     */
    @ApiModelProperty(value = "购买方开户行名称")
    private String gmfkhh;

    /**
     * 购买方开户行银行账号
     */
    @ApiModelProperty(value = "购买方开户行银行账号")
    private String gmfzh;

    /**
     * 经办人
     */
    @ApiModelProperty(value = "经办人")
    private String gmfjbr;

    /**
     * 经办人身份证件号码
     */
    @ApiModelProperty(value = "经办人身份证件号码")
    private String jbrsfzjhm;

    /**
     * 经办人联系电话
     */
    @ApiModelProperty(value = "经办人联系电话")
    private String gmfjbrlxdh;

    /**
     * 合计金额
     */
    @ApiModelProperty(value = "合计金额", required = true)
    @NotNull(message = "合计金额不能为空")
    private BigDecimal hjje;

    /**
     * 合计税额
     */
    @ApiModelProperty(value = "合计税额", required = true)
    @NotNull(message = "合计税额不能为空")
    private BigDecimal hjse;

    /**
     * 价税合计
     */
    @ApiModelProperty(value = "价税合计", required = true)
    @NotNull(message = "价税合计不能为空")
    private BigDecimal jshj;

    /**
     * 收款银行名称
     */
    @ApiModelProperty(value = "收款银行名称")
    private String skyhmc;

    /**
     * 收款银行账号
     */
    @ApiModelProperty(value = "收款银行账号")
    private String skyhzh;

    /**
     * 结算方式
     */
    @ApiModelProperty(value = "结算方式")
    @EnumValue(strValues = {"01", "02", "03", "04", "05", "99"}, message = "结算方式只能是：01 现金 02 银行转账 03 票据 04 第三方支付 05 预付卡 99 其他")
    private String jsfs;

    /**
     * 应税行为发生地
     */
    @ApiModelProperty(value = "应税行为发生地")
    private String ysxwfsd;

    /**
     * 开票人
     */
    @ApiModelProperty(value = "开票人", required = true)
    @NotBlank(message = "开票人不能为空")
    private String kpr;

    /**
     * 开票人证件号码
     */
    @ApiModelProperty(value = "开票人证件号码")
    private String kprzjhm;

    /**
     * 开票人证件类型
     */
    @ApiModelProperty(value = "开票人证件类型")
    private String kprzjlx;

    /**
     * 对应蓝字发票号码
     */
    @ApiModelProperty(value = "对应蓝字发票号码")
    private String dylzfphm;

    /**
     * 红字确认信息单编号
     */
    @ApiModelProperty(value = "红字确认信息单编号")
    private String hzqrxxdbh;

    /**
     * 红字确认单 uuid
     */
    @ApiModelProperty(value = "红字确认单 uuid")
    private String hzqrduuid;

    /**
     * 备注
     */
    @ApiModelProperty(value = "备注")
    private String bz;

    /**
     * 服务器地址
     */
    @ApiModelProperty(value = "服务器地址", required = true)
    private String ip;

    /**
     * mac地址
     */
    @ApiModelProperty(value = "mac地址", required = true)
    private String macdz;

    /**
     * CPU 序列号
     */
    @ApiModelProperty(value = "CPU 序列号")
    private String cpuid;

    /**
     * 主板序列号
     */
    @ApiModelProperty(value = "主板序列号")
    private String zbxlh;

    /**
     * 开票日期
     */
    @ApiModelProperty(value = "开票日期", required = true)
    @NotNull(message = "开票日期不能为空")
    private String kprq;

    /**
     * 是否展示销售方银行账号标签
     */
    @ApiModelProperty(value = "是否展示销售方银行账号标签")
    private String sfzsxsfyhzhbq;

    /**
     * 是否展示购买方银行账号标签
     */
    @ApiModelProperty(value = "是否展示购买方银行账号标签")
    private String sfzsgmfyhzhbq;

    /**
     * 收款人姓名
     */
    @ApiModelProperty(value = "收款人姓名")
    private String skrxm;

    /**
     * 复核人姓名
     */
    @ApiModelProperty(value = "复核人姓名")
    private String fhrxm;

    /**
     * 发票明细列表
     */
    @ApiModelProperty(value = "发票明细列表")
    @Valid
    private List<FpmxInfo> fpmxList;

    /**
     * 附加要素列表
     */
    @ApiModelProperty(value = "附加要素列表")
    @Valid
    private List<FjysInfo> fjysList;

    /**
     * 差额扣除信息列表
     */
    @ApiModelProperty(value = "差额扣除信息列表")
    @Valid
    private List<CekcInfo> cekcList;

    @ApiModel(value = "发票明细信息")
    @Data
    public static class FpmxInfo {
        /**
         * 明细序号
         */
        @ApiModelProperty(value = "明细序号", required = true)
        @NotNull(message = "明细序号不能为空")
        private Long mxxh;

        /**
         * 对应蓝字发票明细序号
         * 红票必传
         */
        @ApiModelProperty(value = "对应蓝字发票明细序号")
        private Long dylzfpmxxh;

        /**
         * 货物或应税劳务、服务名称
         */
        @ApiModelProperty(value = "货物或应税劳务、服务名称", required = true)
        @NotBlank(message = "货物或应税劳务、服务名称不能为空")
        private String hwhyslwfwmc;

        /**
         * 商品服务简称
         */
        @ApiModelProperty(value = "商品服务简称", required = true)
        @NotBlank(message = "商品服务简称不能为空")
        private String spfwjc;

        /**
         * 项目名称
         */
        @ApiModelProperty(value = "项目名称", required = true)
        @NotBlank(message = "项目名称不能为空")
        private String xmmc;

        /**
         * 规格型号
         */
        @ApiModelProperty(value = "规格型号")
        private String ggxh;

        /**
         * 单位
         */
        @ApiModelProperty(value = "单位")
        private String dw;

        /**
         * 数量
         */
        @ApiModelProperty(value = "数量")
        private String sl;

        /**
         * 单价
         */
        @ApiModelProperty(value = "单价")
        private String dj;

        /**
         * 金额
         */
        @ApiModelProperty(value = "金额", required = true)
        @NotNull(message = "金额不能为空")
        private BigDecimal je;

        /**
         * 增值税税率/征收率
         */
        @ApiModelProperty(value = "增值税税率/征收率", required = true)
        @NotNull(message = "增值税税率/征收率不能为空")
        private BigDecimal slv;

        /**
         * 税额
         */
        @ApiModelProperty(value = "税额", required = true)
        @NotNull(message = "税额不能为空")
        private BigDecimal se;

        /**
         * 含税金额
         */
        @ApiModelProperty(value = "含税金额", required = true)
        @NotNull(message = "含税金额不能为空")
        private BigDecimal hsje;

        /**
         * 扣除额
         */
        @ApiModelProperty(value = "扣除额")
        private BigDecimal kce;

        /**
         * 商品和服务税收分类合并编码
         */
        @ApiModelProperty(value = "商品和服务税收分类合并编码", required = true)
        @NotBlank(message = "商品和服务税收分类合并编码不能为空")
        private String sphfwssflhbbm;

        /**
         * 发票行性质
         */
        @ApiModelProperty(value = "发票行性质", required = true)
        @NotBlank(message = "发票行性质不能为空")
        @EnumValue(strValues = {"00", "01", "02"}, message = "发票行性质只能是：00 正常行 01 折扣行 02 被折扣行")
        private String fphxz;

        /**
         * 优惠政策标识
         */
        @ApiModelProperty(value = "优惠政策标识")
        @EnumValue(strValues = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18"},
                message = "优惠政策标识只能是：空 非优惠政策 01 简易征收 02 稀土产品 03 免税 04 不征税 05 先征后退 06 100%先征后退 " +
                          "07 50%先征后退 08 按3%简易征收 09 按5%简易征收 10 按5%简易征收减按1.5%计征 11 即征即退30% 12 即征即退50% " +
                          "13 即征即退70% 14 即征即退100% 15 超税负3%即征即退 16 超税负8%即征即退 17 超税负12%即征即退 18 超税负6%即征即退")
        private String yhzcbs;
    }

    @ApiModel(value = "附加要素信息")
    @Data
    public static class FjysInfo {
        /**
         * 附加要素名称
         */
        @ApiModelProperty(value = "附加要素名称")
        private String fjysmc;

        /**
         * 附加要素类型
         */
        @ApiModelProperty(value = "附加要素类型")
        private String fjyslx;

        /**
         * 附加要素值
         */
        @ApiModelProperty(value = "附加要素值")
        private String fjysz;
    }

    @ApiModel(value = "差额扣除信息")
    @Data
    public static class CekcInfo {
        /**
         * 序号
         */
        @ApiModelProperty(value = "序号")
        private Long xh;

        /**
         * 凭证类型;
         * 01：数电票 02：增值税专用发票 03：增值税普通发票 04：营业税发票 05：财政票据
         * 06：法院裁决书 07：契税完税凭证 08：其他发票类 09：其他扣除凭证
         */
        @ApiModelProperty(value = "凭证类型")
        private String pzlx;

        /**
         * 发票代码
         */
        @ApiModelProperty(value = "发票代码")
        private String fpdm;

        /**
         * 发票号码
         */
        @ApiModelProperty(value = "发票号码")
        private String fphm;

        /**
         * 差额凭证号码
         */
        @ApiModelProperty(value = "差额凭证号码")
        private String cepzhm;

        /**
         * 开具日期;格式必须为 “yyyy-MM-dd”
         */
        @ApiModelProperty(value = "开具日期")
        private String kjrq;

        /**
         * 凭证合计金额
         */
        @ApiModelProperty(value = "凭证合计金额")
        private BigDecimal pzhjje;

        /**
         * 本次扣除金额;该字段需要小于等于凭证合计金额
         */
        @ApiModelProperty(value = "本次扣除金额")
        private BigDecimal bckcje;

        /**
         * 备注
         */
        @ApiModelProperty(value = "备注")
        private String bz;
    }

}
